﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpLockApp
{
    internal class Program
    {
        static void Main(string[] args)
        {
            TestLock test = new TestLock();
            test.StartCounter();

            Console.ReadLine();
        }
    }

    class TestLock
    {

        private int nums = 0;

        private object myLock = new object();  //这个对象也可以不用定义,除非我们用的是静态方法

        public void StartCounter()
        {
            for (int i = 0; i < 5; i++)
            {
                Task.Factory.StartNew(() =>
                {
                    TestCount();
                });
            }
        }

        public void TestCount()
        {
            for(int i = 0;i < 100;i++)
            {
                /*lock (myLock) Lock锁的资源必须是对象，不能是值类型，包括string类型也不行，同时锁的这个资源也必须是线程能访问到的,所以这个不能是局部变量
                {
                    nums++;
                    Console.WriteLine(nums);
                }  */  
                lock(this) //建议直接使用this
                {
                    nums++;
                    Console.WriteLine(nums);
                }
            }
        }
    }
}
